package com.tcm.utils;

import com.tcm.common.enums.CachePrefix;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @author Guqier
 * @version 1.0
 * @date 2023/9/17 20:38
 */
@Component
@SuppressWarnings({"rawtypes", "unchecked"})
public class BattleMatchUtil {

    @Autowired
    private RedisTemplate redisTemplate;

    public static final String QUEUE_CACHE_NAME = CachePrefix.BATTLE_QUEUE_CACHE_NAME.prefix;

    public static final String MATCH_USER_INFO = CachePrefix.BATTLE_MATCH_USER_INFO.prefix;

    public static final String ROOM_CACHE_NAME = CachePrefix.BATTLE_ROOM_CACHE_NAME.prefix;

    /**
     * 匹配队列从坐车入队
     * @param value 入队值
     * @return 处理结果，true为成功
     */
    public void pushToMatchQueue(String value) {
        redisTemplate.opsForList().leftPush(QUEUE_CACHE_NAME, value);
        redisTemplate.expire(QUEUE_CACHE_NAME, 1, TimeUnit.HOURS);
    }

    /**
     * 匹配队列中右侧出队
     * @return 出队值
     */
    public String popFromMatchQueue() {
        return ((String) redisTemplate.opsForList().rightPop(QUEUE_CACHE_NAME));
    }

    /**
     * 从匹配队列中删除指定元素
     * @param value 元素值
     */
    public void removeFromMatchQueue(String value){
        redisTemplate.opsForList().remove(QUEUE_CACHE_NAME, 0, value);
    }

    /**
     * 匹配队列中右侧出队
     * @return 出队值
     */
    public List<String> popFromMatchQueue(Long count) {
        return redisTemplate.opsForList().rightPop(QUEUE_CACHE_NAME, count);
    }

    /**
     * 获取匹配队列玩家个数
     * @return 玩家个数
     */
    public Long getMatchQueueSize() {
        return redisTemplate.opsForList().size(QUEUE_CACHE_NAME);
    }

    /**
     * 存入玩家信息
     * @param key   缓存键
     * @param value 值
     * @param <T>   值类型
     */
    public <T> void setMatchUserInfo(final String key, final T value) {
        redisTemplate.opsForValue().set(MATCH_USER_INFO + key, value, 1, TimeUnit.HOURS);
    }

    /**
     * 获取玩家信息
     * @param key 键
     * @param <T> 对象类型
     * @return 玩家信息
     */
    public <T> T getMatchUserInfo(final String key) {
        return (T) redisTemplate.opsForValue().get(MATCH_USER_INFO + key);
    }

    /**
     * 删除玩家匹配信息
     * @param key 主键
     * @return 删除结果
     */
    public Boolean deleteMatchUserInfo(final String key) {
        return redisTemplate.delete(MATCH_USER_INFO + key);
    }

    /**
     * 存入房间信息
     * @param key   键
     * @param value 值
     * @param <T>   类型
     */
    public <T> void setRoomInfo(final String key, final T value) {
        redisTemplate.opsForValue().set(ROOM_CACHE_NAME + key, value, 1, TimeUnit.HOURS);
    }

    /**
     * 获取房间信息
     * @param key 键
     * @param <T> 类型
     * @return 房间信息
     */
    public <T> T getRoomInfo(final String key) {
        return (T) redisTemplate.opsForValue().get(ROOM_CACHE_NAME + key);
    }

    /**
     * 删除房间匹配信息
     * @param key 主键
     * @return 删除结果
     */
    public Boolean deleteRoomInfo(final String key) {
        return redisTemplate.delete(ROOM_CACHE_NAME + key);
    }

}
